/* 856. 括号的分数 */
/**
 * @param {string} s
 * @return {number}
 */

/* 
    递归
*/
var scoreOfParentheses = function (s) {
	let idx = 0
	const dfs = (s) => {
		let res = 0
		while (idx < s.length && s.charAt(idx) === '(') {
			idx++ // 跳过当前 (
			if (s.charAt(idx) === ')') res += 1 // 没有子节点
			else res += dfs(s) * 2 // 存在子节点
			idx++ // 跳过 当前 )
		}
		return res
	}
	return dfs(s)
}
// 栈
var scoreOfParentheses = function (s) {
	/* 表示空字符串为0 */
	const st = [0]
	for (let i = 0; i < s.length; i++) {
		/*
            我们需要先压入分数0表示A前面的空字符的分数
        */
		if (s[i] === '(') {
			st.push(0)
		} else {
			/*
                我们需要将它弹出栈，并保存到v 如果v = 0 说明
                A是空串 A的分数为1 否则A的分数为2v
            */
			let v = st.pop()
			let top = st.pop() + Math.max(2 * v, 1)
			st.push(top)
		}
	}
	return st[0]
}

scoreOfParentheses('(()(()))')
